'''
Created on 15/04/2013

@author: mirta
'''

from functools import wraps

from flask import g
from flask import session
from flask import redirect
from flask import url_for
from flask import current_app
from flask import flash
from flask import request

from app.models.usuario import Usuario
from app.models.proyecto import Proyecto

from app import app



def permission(method_or_name):
    """
    Esta funcion valida los permisos del usuario logueado sobre las acciones posibles
    en el sistema
    """
    def decorator(method):
        #if callable(method_or_name):
        #    method.gw_method = method.__name__
        #else:
        #    method.gw_method = method_or_name
        @wraps(method)
        def wrapper(*args, **kwargs):
            #current_app.logger.info(g.user.nombre)
            if callable(method_or_name):
                if g.user is None:
                    flash(u'Necesita estar registrado para acceder a esta pagina')
                    return redirect(url_for('acceso.login', next=request.path))
                return method(*args, **kwargs)
            else:
                permiso = method_or_name
                permisos = g.permisos
                current_app.logger.info(permiso)
                current_app.logger.info(permisos)
                for per in permisos :
                    if per.nombre == permiso:
                        return method(*args, **kwargs)
                flash(u'No tiene permiso para ver esta pagina.')
                current_app.logger.info('Permiso no encontrado')
                return redirect(url_for('acceso.home'))
                #current_app.logger.info(method_or_name)
        return wrapper
    if callable(method_or_name):
        return decorator(method_or_name)
    return decorator



@app.before_request
def before_request():
    """
    Trae el perfil del usuario de la base de datos antes de cada peticion
    """
    g.user = None
    if 'usuario_id' in session:
        g.user = Usuario.query.get(session['usuario_id']);
        roles = g.user.roles
        g.permisos = []
        for rol in roles:
            g.permisos = g.permisos + rol.permiso
            
            
    if 'proyecto_id' in session:
        g.proyecto = Proyecto.query.get(session['proyecto_id']);
    else:
        g.proyecto = None
            

